package com.odontosis.view.paciente.pagamento;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import com.odontosis.entidade.Mes;
import com.odontosis.entidade.Pagamento;
import com.odontosis.entidade.Servico;
import com.odontosis.entidade.TipoServico;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.service.PagamentoService;
import com.odontosis.service.ServicoService;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisForm;

public class FormPagamento extends OdontosisForm {
	
	private String pacienteId;
	
	private String numeroPaciente;
	
	private String nomePaciente;
	
	private String mesVencimento;
	
	private String mesVencimentoFinal;
	
	private String anoVencimento;
	
	private String numeroPagamento;
	
	private boolean inicio=false;
	
	private String justificativa;
	
	private String justificativaIsencao;
	
	public List<String> erros;
	
	private boolean pesquisou;

	public boolean isPesquisou() {
		return pesquisou;
	}

	public void setPesquisou(boolean pesquisou) {
		this.pesquisou = pesquisou;
	}

	public boolean isInicio() {
		return inicio;
	}

	public void setInicio(boolean inicio) {
		this.inicio = inicio;
	}

	public String getMesVencimento() {
//		if(StringUtilsOdontosis.isVazia(mesVencimento)){
//			Calendar calendar = Calendar.getInstance();
//			SimpleDateFormat formato = new SimpleDateFormat("MM");
//			String mes = formato.format(calendar.getTime());
//			Integer mesNumero = Integer.parseInt(mes);
//			mesNumero++;
//			mes = mesNumero.toString();
//			return StringUtilsOdontosis.formatarMes(mes);
//		}
		return mesVencimento;
	}

	public void setMesVencimento(String mesVencimento) {
		this.mesVencimento = mesVencimento;
	}

	
	public String getMesVencimentoFinal() {
//		if(StringUtilsOdontosis.isVazia(mesVencimentoFinal)){
//			Calendar calendar = Calendar.getInstance();
//			SimpleDateFormat formato = new SimpleDateFormat("MM");
//			String mes = formato.format(calendar.getTime());
//			Integer mesNumero = Integer.parseInt(mes);
//			mesNumero++;
//			mes = mesNumero.toString();
//			return StringUtilsOdontosis.formatarMes(mes);
//		}
		return mesVencimentoFinal;
	}

	public void setMesVencimentoFinal(String mesVencimentoFinal) {
		this.mesVencimentoFinal = mesVencimentoFinal;
	}
	
	public String getAnoVencimento() {
//		if(StringUtilsOdontosis.isVazia(anoVencimento)){
//			Calendar calendar = Calendar.getInstance();
//			SimpleDateFormat formato = new SimpleDateFormat("yyyy");
//			String ano = formato.format(calendar.getTime());
//			return ano;
//		}
		return anoVencimento;
	}
	
	

	public void setAnoVencimento(String anoVencimento) {
		this.anoVencimento = anoVencimento;
	}

	public String getNumeroPaciente() {
		return numeroPaciente;
	}

	public void setNumeroPaciente(String numeroPaciente) {
		this.numeroPaciente = numeroPaciente;
	}

	public String getNomePaciente() {
		return nomePaciente;
	}

	public void setNomePaciente(String nomePaciente) {
		this.nomePaciente = nomePaciente;
	}
	
	public Mes getMesCorrente(){
		Calendar calendar = Calendar.getInstance();
		SimpleDateFormat formato = new SimpleDateFormat("MM");
		String mes = formato.format(calendar.getTime());
		return Mes.recuperarPorId(Integer.parseInt(mes));
	}
	
	
	public Collection<Mes> getColecaoMeses(){
		Collection<Mes> meses = new ArrayList<Mes>();
		for (Mes mes : Mes.values()) {
			if(mes != Mes.IGNORADO){
				meses.add(mes);
			}
		}
		return meses;
	}

	public String getPacienteId() {
		return pacienteId;
	}

	public void setPacienteId(String pacienteId) {
		this.pacienteId = pacienteId;
	}

	public String getNumeroPagamento() {
		return numeroPagamento;
	}

	public void setNumeroPagamento(String numeroPagamento) {
		this.numeroPagamento = numeroPagamento;
	}

	public List<String> getErros() {
		return erros;
	}

	public void setErros(List<String> erros) {
		this.erros = erros;
	}

	public String getJustificativa() {
		return justificativa;
	}

	public void setJustificativa(String justificativa) {
		this.justificativa = justificativa;
	}

	@Override
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		ActionMessages messages = new ActionMessages();		
		
		if(!StringUtilsOdontosis.isVazia(getMetodo()) && getMetodo().equals("pesquisar")) {
			if(StringUtilsOdontosis.isVazia(pacienteId)){
				messages.add("pacienteId",new ActionMessage("O campo Paciente deve ser inofrmado."));
			}
			
			if(StringUtilsOdontosis.isVazia(getAnoVencimento()) && (!StringUtilsOdontosis.isVazia(getMesVencimento()) && (!StringUtilsOdontosis.isVazia(getMesVencimentoFinal())))){
				messages.add("pacienteId",new ActionMessage("O campo Ano deve ser informado."));
			}
			if((StringUtilsOdontosis.isInteger(getMesVencimento()) && (StringUtilsOdontosis.isInteger(getMesVencimentoFinal())))){
				if(Integer.parseInt(getMesVencimento()) > Integer.parseInt(getMesVencimentoFinal())){
					messages.add("pacienteId",new ActionMessage("O mês inicial deve ser menor ou igual ao mês vencimento final."));
				}
			}
		}
		
		if(!StringUtilsOdontosis.isVazia(getMetodo()) && getMetodo().equals("isentar")) {
			PagamentoService service = ContainerIoc.getPagamentoService();
			Pagamento pagamento = service.load(Long.parseLong(getNumeroPagamento()));
			if(StringUtilsOdontosis.isVazia(pagamento.getJustificativa())) {
				messages.add("pacienteId",new ActionMessage("Antes de isentar a parcela insira uma justificativa."));
			}
		}

		if (messages.size() > 0 && getMetodo() != null) {
			errors.add(messages);
			erros = new ArrayList<String>();
			for (Iterator iterator = messages.get(); iterator.hasNext();) {
				ActionMessage string = (ActionMessage) iterator.next();
				erros.add(string.getKey());
			}
			request.setAttribute("mensagens", erros);
			return errors;
		} else {
			request.setAttribute("mensagens", null);
			return super.validate(mapping, request);
		}
	}

	public String getJustificativaIsencao() {
		return justificativaIsencao;
	}

	public void setJustificativaIsencao(String justificativaIsencao) {
		this.justificativaIsencao = justificativaIsencao;
	}
	
	
	
	
	
	
	
	
	
	

}
